package com.crcchem.practice.demos.web.controller;

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Cookie 是什么？
 * Cookie 是浏览器和服务器之间传递的小数据，通常由服务器设置在客户端中，后续请求会自动带上。
 * <p>
 * Cookie 的关键参数
 * 参数	        含义说明
 * name/value	键值对
 * maxAge	    有效时间（秒），0 表示删除，负值表示浏览器关闭即删除
 * path	        指定 Cookie 生效的路径
 * <p>
 * Cookie 是客户端技术
 * Session 是服务器端技术
 * <p>
 * 技术	    数据存储位置
 * Cookie	客户端浏览器中
 * Session	服务器内存、缓存或数据库中
 * <p>
 * Cookie 储存在客户端，用户看得见；
 * Session 储存在服务器端，用户看不见。
 * Cookie 简单但不安全，Session 更安全但依赖服务器资源。
 */

/**
 * Cookie 的方式：
 * 服务器告诉浏览器：你登录了，我给你发一个 cookie，比如 username=TangRuoJie
 * 浏览器下次访问时会自动带上这个 cookie
 * 服务器根据 cookie 里的内容来判断你是谁
 * <p>
 * Session 的方式：
 * 服务器给你分配一个 ID，比如 JSESSIONID=abc123
 * 浏览器保存这个 ID（通常放在 cookie 中）
 * 服务器自己保存这个 ID 对应的用户信息（比如你的用户名、权限等）
 * 下次访问时服务器拿这个 ID 去“查库”找到你的信息
 */
@RestController
@RequestMapping("/Cookie")
public class CookieController {

    /**
     * 设置 Cookie
     */
    @GetMapping("/setCookie")
    public String setCookie(HttpServletResponse response) {
        Cookie cookie = new Cookie("username", "admin");
        /**
         * 访问路径
         */
        cookie.setPath("/");
        /**
         * 有效时间
         */
        cookie.setMaxAge(3600);
        response.addCookie(cookie);
        return "setCookie";
    }

    /**
     * 获取 Cookie
     */
    @GetMapping("/getCookie")
    public String getCookie(HttpServletRequest request) {
        Cookie[] cookies = request.getCookies();
        if (cookies != null) {
            for (Cookie cookie : cookies) {
                if (cookie.getName().equals("username")) {
                    return "Cookie值为：" + cookie.getValue();
                }
            }
        }
        return "未找到名为 username 的 Cookie";
    }

    /**
     * 删除 Cookie
     */
    @GetMapping("/deleteCookie")
    public String deleteCookie(HttpServletResponse response) {
        /**
         * 设置值为 null
         */
        Cookie cookie = new Cookie("username", null);
        /**
         * 要与创建时 path 保持一致
         */
        cookie.setPath("/");
        /**
         * 设置立即过期
         */
        cookie.setMaxAge(0);
        response.addCookie(cookie);
        return "deleteCookie";
    }

}
